package com.shuzi.MediaShare.utils;

import android.util.Log;

/**
 * log帮助类
 * 
 * @author lung 下午11:51:44 2013
 */
public class Logger
{
	/**
	 * log tag
	 */
	private String TAG = "Logger";// application name

	/**
	 * debug or not
	 */
	private static boolean debug = true;

	private static Logger instance = new Logger();

	private Logger()
	{

	}

	public static Logger getLogger()
	{
		return instance;
	}

	private String getFunctionName()
	{
		StackTraceElement[] sts = Thread.currentThread().getStackTrace();

		if (sts == null)
		{
			return null;
		}

		for (StackTraceElement st : sts)
		{
			if (st.isNativeMethod())
			{
				continue;
			}

			if (st.getClassName().equals(Thread.class.getName()))
			{
				continue;
			}

			if (st.getClassName().equals(this.getClass().getName()))
			{
				continue;
			}

			return "[" + Thread.currentThread().getName() + "("
					+ Thread.currentThread().getId() + "): " + st.getFileName()
					+ ":" + st.getLineNumber() + "]";
		}

		return null;
	}

	private String createMessage(String msg)
	{
		String functionName = getFunctionName();
		String message = (functionName == null ? msg
				: (functionName + " - " + msg));
		return message;
	}

	/**
	 * log.i
	 */
	public void i(String msg)
	{
		if (debug)
		{
			String message = createMessage(msg);
			Log.i(TAG, message);
		}
	}

	/**
	 * log.i
	 */
	public void i(String tag, String msg)
	{
		if (debug)
		{
			String message = createMessage(msg);
			Log.i(tag, message);
		}
	}

	/**
	 * log.v
	 */
	public void v(String msg)
	{
		if (debug)
		{
			String message = createMessage(msg);
			Log.v(TAG, message);
		}
	}

	/**
	 * log.v
	 */
	public void v(String tag, String msg)
	{
		if (debug)
		{
			String message = createMessage(msg);
			Log.v(tag, message);
		}
	}

	/**
	 * log.d
	 */
	public void d(String msg)
	{
		if (debug)
		{
			String message = createMessage(msg);
			Log.d(TAG, message);
		}
	}

	/**
	 * log.d
	 */
	public void d(String tag, String msg)
	{
		if (debug)
		{
			String message = createMessage(msg);
			Log.d(tag, message);
		}
	}

	/**
	 * log.e
	 */
	public void e(String msg)
	{
		if (debug)
		{
			String message = createMessage(msg);
			Log.e(TAG, message);
		}
	}

	/**
	 * log.e
	 */
	public void e(String tag, String msg)
	{
		if (debug)
		{
			String message = createMessage(msg);
			Log.e(tag, message);
		}
	}

	/**
	 * log.error
	 */
	public void error(Exception e)
	{
		if (debug)
		{
			StringBuffer sb = new StringBuffer();
			String name = getFunctionName();
			StackTraceElement[] sts = e.getStackTrace();

			if (name != null)
			{
				sb.append(name + " - " + e + "\r\n");
			} else
			{
				sb.append(e + "\r\n");
			}
			if (sts != null && sts.length > 0)
			{
				for (StackTraceElement st : sts)
				{
					if (st != null)
					{
						sb.append("[ " + st.getFileName() + ":"
								+ st.getLineNumber() + " ]\r\n");
					}
				}
			}
			Log.e(TAG, sb.toString());
		}
	}

	/**
	 * log.d
	 */
	public void w(String msg)
	{
		if (debug)
		{
			String message = createMessage(msg);
			Log.w(TAG, message);
		}
	}

	public void setTag(String tag)
	{
		this.TAG = tag;
	}

	/**
	 * set debug
	 */
	public static void setDebug(boolean d)
	{
		debug = d;
	}
}